package util;

import java.text.MessageFormat;
import java.util.ResourceBundle;

import javax.faces.context.FacesContext;

/**
 * @class UtilMensagem.java
 * 
 *        Classe com metodos utilitarios para acessar arquivos de mensagens.
 * 
 */
public final class UtilMensagem {

	private UtilMensagem() {
		// Singleton
	}

	/**
	 * Retorna o {@link ResourceBundle} associado ao caminho do arquivo de mensagens da aplicacao especificado.
	 * 
	 * @param caminhoArquivoMensagens
	 * @return
	 */
	private static ResourceBundle getResourceBundle(String caminhoArquivoMensagens) {
		return ResourceBundle.getBundle(caminhoArquivoMensagens);
	}

	/**
	 * Retorna o {@link ResourceBundle} associado ao arquivo de mensagens especificado no faces-config.xml.
	 * 
	 * @return
	 */
	private static ResourceBundle getResourceBundle() {
		FacesContext context = FacesContext.getCurrentInstance();
		String caminhoArquivoMensagens = null;
		if (context == null) {
			// para o casos de testes, pois nao usam JSF
			caminhoArquivoMensagens = "mensagens";
		} else {
			caminhoArquivoMensagens = context.getApplication().getMessageBundle();
		}
		return getResourceBundle(caminhoArquivoMensagens);
	}

	/**
	 * Retorna a mensagem do arquivo de mensagens especificado, identificada pela chave informada. A mensagem retornada
	 * e formatada a partir dos parametros especificados.
	 * 
	 * @param caminhoArquivoMensagens
	 * @param chave
	 * @param parametros
	 * @return
	 */
	public static String getMensagem(String caminhoArquivoMensagens, String chave, Object... parametros) {
		String mensagem = null;
		ResourceBundle resourceBundle = getResourceBundle(caminhoArquivoMensagens);
		if (resourceBundle != null) {
			mensagem = resourceBundle.getString(chave);
		}
		if (parametros != null) {
			mensagem = MessageFormat.format(mensagem, parametros); // NOPMD
		}
		return mensagem;
	}

	/**
	 * Retorna a mensagem do arquivo de mensagens especificado no faces-config.xml, identificada pela chave informada. A
	 * mensagem retornada e formatada a partir dos parametros especificados.
	 * 
	 * @param chave
	 * @param parametros
	 * @return
	 */
	public static String getMensagem(String chave, Object... parametros) {
		String mensagem = null;
		ResourceBundle resourceBundle = getResourceBundle();

		if (resourceBundle != null) {
			mensagem = resourceBundle.getString(chave);
		}
		if (parametros != null) {
			mensagem = MessageFormat.format(mensagem, parametros); // NOPMD
		}
		return mensagem;
	}

	/**
	 * Retorna a mensagem do arquivo de mensagens especificado, identificada pela chave informada.
	 * 
	 * @param caminhoArquivo
	 * @param chave
	 * @return
	 */
	public String getMensagem(String caminhoArquivo, String chave) {
		return getMensagem(caminhoArquivo, chave, (Object[]) null);
	}

	/**
	 * Retorna a mensagem do arquivo de mensagens especificado no faces-config.xml, identificada pela chave informada.
	 * 
	 * @param chave
	 * @return
	 */
	public static String getMensagem(String chave) {
		return getMensagem(chave, (Object[]) null);
	}

	public String getMensagem(String... chaves) {
		String mensagem = "";
		for (String chave : chaves) {
			String msg = getMensagem(chave, (Object[]) null);
			mensagem = UtilString.concatenar(mensagem, " ", msg); // NOPMD
		}
		return mensagem.equals("") ? "" : mensagem.substring(1);
	}

}